package com.xzc.java8.C_Collect;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class ReductJoinTest {

    public static void main(String[] args) {
        Stream<Integer> stream = Arrays.asList(1, 2, 3, 4, 5, 6).stream();
        //第1个参数是结果集-充当累积器
        //第2个参数是一个映射，如何将SRC映射为结果集的类型，并在FORK中抽取出来
        //第3个参数是如果将FORK出来的新数据进行JOIN，最后归约成结果集，每JOIN一次就会产生一个新数据。但这个JOIN操作是在参数1上进行的，这就产生了竞状条件，变成线程不安全。如果要线程安全，就要每次JOIN产生新的对象，这又是一种空间浪费。所以collect要优于reduct
        List<Integer> numbers = stream.reduce(new ArrayList<Integer>(),
                ((List<Integer> l, Integer e) -> {
                    l.add(e);
                    return l;
                }),
                (List<Integer> l1, List<Integer> l2) -> {
                    l1.addAll(l2);
                    return l1;
                });
        System.out.println(numbers);

        //一并行就完蛋，因为是操作同一个ArrayList<Integer>
        Stream<Integer> streamPall = Arrays.asList(1, 2, 3, 4, 5, 6).parallelStream();
        numbers = streamPall.reduce(new ArrayList<Integer>(),
                ((List<Integer> l, Integer e) -> {
                    l.add(e);
                    return l;
                }),
                (List<Integer> l1, List<Integer> l2) -> {
                    l1.addAll(l2);
                    return l1;
                });
        System.out.println(numbers);

        //collect优于reduce，可以并行，不知道有没有空间上的浪费了
        Stream<Integer> streamCollect = Arrays.asList(1, 2, 3, 4, 5, 6).parallelStream();
        numbers = streamCollect.collect(Collectors.toList());
        System.out.println(numbers);
    }
}
